package SBD.Servicios;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Properties;

/**
* @class FactoriaServicios
* @author Mauricio Alvarez.
* @date 12-Diciembre-2010.
* @brief Representa las instancias de servicio de conexión a la base de datos.
*/

public class FactoriaServicios {

   /**
    * @var Conexion cdb
    * @brief Permite instanciar un servicio de conexion a BD.
    */
    private Conexion cdb;
   /**
    * @var FactoriaServicios instancia
    * @brief Atributo compartido para todas las instancias de la clase factoria de serivios.
    */
    private static FactoriaServicios instancia;

    /**
     * @brief Crea una nueva instancia de factoriaServicios.
     * @return No presenta retorno
    */
    public FactoriaServicios() {
    }

    /**
     * @brief El constructor se asegura de que se cree una sola instancia de la propia factoria.
     * @return FactoriaServicios
    */
    public static synchronized FactoriaServicios getInstancia()
    {
        if (instancia == null)
        {
            instancia = new FactoriaServicios();
        }
        return instancia;
    }

    /**
     * @brief En este método se verifica si la instancia existe previamente, en caso de que exista se retorna el objeto que se tiene y en caso contrario se crea.
     * @return Conexion
     * En este caso se verifica que la conexión exista en caso de que así sea
     * entonces se retorna, de lo contrario se crear la conexión de acuerdo a lo
     * definido  en  la  propiedad  databaseclass  definida  dentro  del  archivo
     * configdatabase definido en una de las actividades anteriores.
    */
    public Conexion getConexionBD () throws java.lang.ClassNotFoundException,
                                            java.lang.InstantiationException,
                                            java.lang.IllegalAccessException,
                                            IOException,
                                            SQLException
    {
        if (cdb == null)
        {
            //Esta propiedad se lee desde el archivo de propiedades
            //y se mantiene en memoria. Esto se hizo en la main class
            Properties propiedades = new Properties();
            propiedades.load(new FileInputStream("src/SBD/propiedades/DatosConexionBD.properties"));
            //String nombreClase = propiedades.getProperty("databaseclass");
            String nombreClase = "BD.Servicios.Conexion_MySQL";

            //Aqui se crea la instancia de la clase especifica de la
            //base de datos con la que queremos trabajar (las cuales
            //deben heredar de conexion).
            //cdb = (Conexion) Class.forName(nombreClase).newInstance();
            Conexion_MySQL c = new Conexion_MySQL();
            cdb = (Conexion) c;
        }
        return cdb;
    }

}//FIN FactoriaServicios